命令模式
定义命令模式
命令模式将”请求”封装成命令对象,以便使用不同的请求、队列或者日志来参数化其他对象,作为命令执行实际的主体,也就是命令实际的接收者。命令模式还可支持可撤销的操作。
一个命令对象通过在特定接收者上绑定一组动作来封装一个请求。要做到这一点,命令对象将动作和接收者包装进对象。这个对象只暴露一个execute()方法,当此方法被调用时,接收者就会进行这些动作。从外面开来,调用对象并不知道究竟哪个接收者进行了哪些动作,只知道如果调用exectue()方法,请求的目的就能达到。
通过对基本命令模式进行扩展,我们可以轻易实现Meta command pattern。meta command pattern可以创建命令的宏,以便依次执行多个命令。
1 | public interface Command { |
1 | public class SimpleRemoteControl { |
1 | public class RemoteControlTest { |
提供撤销操作
通过提供在Command提供undo方法,我们可以实现撤销操作。如果有多个命令对象,则需要记录前面一个操作的是哪个命令对象。
1 | public interface Command { |
1 | public class LightOffCommand implements Command { |
1 | public class RemoteControlWithUndo { |
使用状态实现撤销
如果需要实现更复杂的撤销操作,我们需要加入状态,并记录前面的状态。
1 | public class CeilingFan { |
1 | public class CeilingFanHighCommand implements Command { |
使用宏命令
通过宏命令,我们可以一次执行多个命令。宏命令本身也是封装为一个命令对象。
1 | public class MacroCommand implements Command { |
1 | public class RemoteControl { |
1 | public class RemoteLoader { |
命令模式还可以用于日志请求。某些应用需要我们将所有的动作都记录在日志中,并能在系统死机之后,重新调用这些动作恢复到之前到状态。
也就是执行命令的时候,将历史记录存储在磁盘中。一旦系统死机,就可以将命令对象重新加载,并依次调用这些对象的execture()方法。